package br.ita.doacoes.view.templates;

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.swingBean.actions.ApplicationAction;
import org.swingBean.descriptor.BeanTableModel;
import org.swingBean.descriptor.TableFieldDescriptor;
import org.swingBean.descriptor.XMLDescriptorFactory;
import org.swingBean.gui.JActButton;
import org.swingBean.gui.JBeanTable;
import org.swingBean.util.BeanUtils;

import br.ita.doacoes.view.cadastrodoacoes.refresher.Refresher;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class ConsultaDetalheMestreDetalhe extends ConsultaDetalheSimples {

	protected BeanTableModel modelDetalhe;
	protected JBeanTable tableDetalhe;
	protected JPanel detalheButtonPanel;
	protected JActButton botaoInsereDetalhe;
	protected JActButton botaoExcluiDetalhe;
	
	private String tableDetalheName;
	private String xmlTableDetalhe;
	private Class classeDetalhe;
	private int larguraTabela = 150;
	private int alturaTabelaDetalhe = 150;
	private String detalheProperty;
	
	@Override
	public void init(Object o) {
		super.init(o);
		modelDetalhe.setBeanList((List)BeanUtils.getProperty(o, detalheProperty));
	}

	public int getLarguraTabela() {
		return larguraTabela;
	}

	public void setLarguraTabela(int larguraTabela) {
		this.larguraTabela = larguraTabela;
	}

	public int getAlturaTabelaDetalhe() {
		return alturaTabelaDetalhe;
	}

	public void setAlturaTabelaDetalhe(int alturaTabelaDetalhe) {
		this.alturaTabelaDetalhe = alturaTabelaDetalhe;
	}

	public ConsultaDetalheMestreDetalhe(JFrame frame) {
		super(frame);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void initComponents() {
		super.initComponents();
		TableFieldDescriptor tabledescriptor = XMLDescriptorFactory
		.getTableFieldDescriptor(classeDetalhe, xmlTableDetalhe,
				tableDetalheName);
		modelDetalhe = new BeanTableModel(tabledescriptor);
		tableDetalhe = new JBeanTable(modelDetalhe);
	}
	
	@Override
	protected void putComponentsInPanel() {
		setLayout(new BorderLayout());

		JPanel mestreDetalhePanel = new JPanel();
		FormLayout formlayout = new FormLayout(
				"FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:"+larguraTabela+"DLU:NONE",
				"CENTER:"+alturaTabelaDetalhe+"DLU:GROW(1.0),CENTER:DEFAULT:NONE");
		CellConstraints cc = new CellConstraints();
		mestreDetalhePanel.setLayout(formlayout);
		mestreDetalhePanel.add(new JScrollPane(tableDetalhe), cc.xy(3, 1));
		mestreDetalhePanel.add(panelFormulario, cc.xywh(1, 1, 1, 2));
		mestreDetalhePanel.add(detalheButtonPanel, cc.xy(3, 2));

		add(mestreDetalhePanel, BorderLayout.NORTH);
		add(panelButton, BorderLayout.SOUTH);
	}
	
	@Override
	protected void createButtons(final Object o) {

		botaoUpdate = new JActButton("Salvar",
				new ApplicationAction() {
					public void execute() {
						panelFormulario.populateBean(o);
						BeanUtils.setProperty(o, detalheProperty, modelDetalhe.getCompleteList());
						getDao().update(o);
						Refresher.refresh();
					}
				});

		botaoSair = new JActButton("Sair",
				new ApplicationAction() {
					public void execute() {
						getFrame().dispose();
					}
				});


		botaoInsereDetalhe = new JActButton("Inserir", new ApplicationAction() {
			public void execute() {
				Object c = null;
				try {
					c = getClasseDetalhe().newInstance();
				} catch (Exception e ){
					e.printStackTrace();
				}
				tableDetalhe.editingStopped(null);
				modelDetalhe.addBean(c);
			}
		});
		
		botaoExcluiDetalhe = new JActButton("Excluir", new ApplicationAction() {
			public void execute() {
				tableDetalhe.editingStopped(null);
				modelDetalhe.deleteBeanAt(tableDetalhe.getSelectedRow());
			}
		});
	}
	
	protected void createButtonPanel() {
		super.createButtonPanel();
		detalheButtonPanel = new JPanel();
		detalheButtonPanel.add(botaoInsereDetalhe);
		detalheButtonPanel.add(botaoExcluiDetalhe);
	}

	public String getTableDetalheName() {
		return tableDetalheName;
	}

	public void setTableDetalheName(String tableDetalheName) {
		this.tableDetalheName = tableDetalheName;
	}

	public String getXmlTableDetalhe() {
		return xmlTableDetalhe;
	}

	public void setXmlTableDetalhe(String xmlTableDetalhe) {
		this.xmlTableDetalhe = xmlTableDetalhe;
	}

	public Class getClasseDetalhe() {
		return classeDetalhe;
	}

	public void setClasseDetalhe(Class classeDetalhe) {
		this.classeDetalhe = classeDetalhe;
	}

	public String getDetalheProperty() {
		return detalheProperty;
	}

	public void setDetalheProperty(String detalheProperty) {
		this.detalheProperty = detalheProperty;
	}

}
